package com.wei.czz.framework.game.controller;

import java.util.List;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.common.NameValue;
import com.wei.czz.common.dto.game.GameUserDto;
import com.wei.czz.common.jsr303.group.OrderSearch;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.common.UpdateStatusVo;
import com.wei.czz.common.vo.game.DeleteGameUserVo;
import com.wei.czz.common.vo.game.GameUserFormVo;
import com.wei.czz.common.vo.game.GameUserVo;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import com.wei.czz.framework.game.service.GameUserService;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2023-03-16 11:36:47
 * className: GameUserController 游戏用户请求接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("/game-user")
@AllArgsConstructor
public class GameUserController {

    private static final Logger log = LoggerFactory.getLogger(GameUserController.class);

    private final GameUserService gameUserService;

    /**
     * 保存游戏用户接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏用户管理页-游戏用户添加/修改弹出框调用
     * <p>
     * 此接口会校验是否重复提交
     * @param gameUserVo 参数对象
     */
    @Resubmit(message = "保存游戏用户")
    @PostMapping("/save")
    @Auth(permit = "game:user:save")
    public Result<Object> saveGameUser(@RequestBody GameUserVo gameUserVo) {
        log.info("开始保存游戏用户业务。{}", gameUserVo);
        if (gameUserVo.isSaveParamsFail()) {
            log.info("保存游戏用户接口，请求参数错误");
            return Result.paramFail();
        }

        gameUserService.saveGameUser(gameUserVo);

        log.info("保存游戏用户业务结束");
        return Result.success();
    }

    /**
     * 分页查询游戏用户列表接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏用户管理页调用
     *
     * @param gameUserFormVo 参数对象
     * @return 游戏用户分页数据
     */
    @RequestMapping("/page/list")
    @Auth(permit = "game:user:list")
    public Result<PageDto<GameUserDto>> pageGameUserList(@Validated(OrderSearch.class) @RequestBody GameUserFormVo gameUserFormVo) {
        log.info("开始分页查询游戏用户列表业务。{}", gameUserFormVo);

        PageDto<GameUserDto> pageDto = gameUserService.pageGameUserList(gameUserFormVo);

        log.info("分页查询游戏用户列表业务结束");
        return Result.success(pageDto);
    }

    /**
     * 获取游戏用户列表接口
     * 只查询简单数据
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏管理页-游戏流水弹出框调用
     * @param gameId 游戏主键
     * @return 游戏用户列表
     */
    @GetMapping("/simple/list")
    @Auth(permit = "game:list")
    public Result<List<NameValue<String>>> getSimpleGameUserList(@RequestParam("gameId") Long gameId) {
        log.info("开始获取游戏用户列表业务。gameId={}", gameId);

        List<NameValue<String>> gameUserList = gameUserService.getSimpleGameUserList(gameId);

        log.info("获取游戏用户列表业务结束");
        return Result.success(gameUserList);
    }

    /**
     * 增加游戏用户可用次数接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏用户管理页-游戏用户添加/修改弹出框调用
     * <p>
     * 此接口会校验是否重复提交
     * @param gameUserVo 参数对象
     */
    @Resubmit(message = "增加可用次数")
    @PostMapping("/increment/num")
    @Auth(permit = "game:user:update")
    public Result<Object> incrementGameNum(@RequestBody GameUserVo gameUserVo) {
        log.info("开始增加游戏用户可用次数业务。{}", gameUserVo);
        if (gameUserVo.isUpdateParamsFail()) {
            log.info("增加游戏用户可用次数接口，请求参数错误");
            return Result.paramFail();
        }

        gameUserService.incrementGameNum(gameUserVo);

        log.info("增加游戏用户可用次数业务结束");
        return Result.success();
    }

    /**
     * 修改游戏用户状态接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏用户管理页调用
     * <p>
     * 此接口会校验是否重复提交
     * @param updateStatusVo 参数对象
     */
    @Resubmit(message = "修改游戏用户状态")
    @PostMapping("/update/status")
    @Auth(permit = "game:user:update")
    public Result<Object> updateGameUserStatus(@Validated @RequestBody UpdateStatusVo updateStatusVo) {
        log.info("开始修改游戏用户状态业务。{}", updateStatusVo);

        gameUserService.updateGameUserStatus(updateStatusVo);

        log.info("修改游戏用户状态业务结束");
        return Result.success();
    }

    /**
     * 删除游戏用户接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-游戏用户管理页调用
     * <p>
     * 此接口会校验是否重复提交
     * @param deleteGameUserVo 参数对象
     */
    @Resubmit(message = "删除游戏用户")
    @RequestMapping("/delete")
    @Auth(permit = "game:user:delete")
    public Result<Object> deleteGameUser(@RequestBody DeleteGameUserVo deleteGameUserVo) {
        log.info("开始删除游戏用户业务。{}", deleteGameUserVo);
        if (deleteGameUserVo.isParamsFail()) {
            log.info("删除游戏用户接口，请求参数错误");
            return Result.paramFail();
        }

        gameUserService.deleteGameUser(deleteGameUserVo);

        log.info("删除游戏用户业务结束");
        return Result.success();
    }

}
